<?php

abstract class Controle {
	protected $Sistema;
	protected $Aplicacao;
	protected $Core;
	protected $Dao;
	protected $Conteudo;
	protected $TrocaConteudo = array();
	protected $Modelo;
	protected $NomeModelo = '';
	public    $titulo;
	protected $persistencia = false;
	protected $elementos_invisiveis = array();
	protected $input_values = array();
	private $plugins = array();
	private $onload = array();

	/* Propriedades e métodos referentes ao datagrid */
	private $grid_campos = array();
	private $chave_primaria;
	private $acoes_permitidas = array();
	private $grid_filtros = array();
	private $grid_pagina;
	private $extensao_paginacao = 5;
	private $itens_por_pagina = 20;
	private $ordenacao = array();

	public function GridCampos($campos = ''){
		if($campos != '' && sizeof($campos) > 0){
			foreach($campos as $key => $valor){
				$this->grid_campos[$key] = $valor;
			}
		}else{
			return $this->grid_campos;
		}
	}

	public function ChavePrimaria($chave = ''){
		if($chave){
			$this->chave_primaria = $chave;
		}else{
			return $this->chave_primaria;
		}
	}

	public function AcoesPermitidas($acoes = ''){
		if($acoes != '' && sizeof($acoes) > 0){
			foreach($acoes as $key => $valor){
				$this->acoes_permitidas[$key] = $valor;
			}
		}else{
			return $this->acoes_permitidas;
		}
	}

	public function GridFiltros($filtros = ''){
		if($filtros != '' && sizeof($filtros) > 0){
			foreach($filtros as $key => $valor){
				$this->grid_filtros[$key] = $valor;
			}
		}else{
			return $this->grid_filtros;
		}
	}

	public function GridPagina($pagina = ''){
		if($pagina){
			$this->grid_pagina = $pagina;
		}else{
			return $this->grid_pagina;
		}
	}
	
	public function GridExtensaoPaginacao($quantidade = ''){
		if($quantidade){
			$this->extensao_paginacao = $quantidade;
		}else{
			return $this->extensao_paginacao;
		}
	}

	public function ItensPorPagina($quantidade = ''){
		if($quantidade){
			$this->itens_por_pagina = $quantidade;
		}else{
			return $this->itens_por_pagina;
		}
	}

	public function Ordenacao($ordem = ''){
		if($ordem){
			$this->ordenacao = $ordem;
		}else{
			return $this->ordenacao;
		}
	}

	/* Fim das propriedades e métodos referentes ao datagrid */

	public function AddOnLoad($funcao){
		$this->onload = $funcao;
	}

	public function GetOnload(){
		return $this->onload;
	}

	public function GetPlugins(){
		return $this->plugins;	
	}

	/**
	 * registra nome dos plugins que serão chamados pelo controlador
	 * @param array $plugins
	 */
	public function AddPlugins($plugins){
		foreach($plugins as $plugin){
			array_push($this->plugins, $plugin);
		}
	}

	public function SetInputValor($id, $valor){
			$this->input_values[$id] = $valor;
	}
	
	public function GetInputValores(){
		return $this->input_values;
	}
	
	public function EscondeElemento($id){ 
		array_push($this->elementos_invisiveis, $id);
	}

	public function MostraElemento($id){
		$elements = $this->elementos_invisiveis;
		$tmp_array = array();
		
		for($i = 0; $i < sizeof($elements); $i++){
			if($id != $elements[$i]){
				array_push($tmp_array, $id);
			}
		}
		
		$this->elementos_invisiveis = $tmp_array;
	}
	
	public function GetElementosHidden(){
		return $this->elementos_invisiveis;
	}

	/**
	 * Retorna Sistema
	 * 
	 * @return Sistema
	 */
	public function GetSistema(){
		return $this->Sistema;
	}

	/**
	 * Retorna Aplicacao
	 * 
	 * @return Aplicacao
	 */
	Public function GetAplicacao(){
		return $this->Aplicacao;
	}

	/**
	 * Retorna Core
	 * 
	 * @return Core
	 */
	public function GetCore(){
		return $this->Core;
	}

	/**
	 * Retorna Dao
	 * 
	 * @return Dao
	 */
	public function GetDao(){
		return $this->Dao;
	}

	/**
	 * Retorna o nome do modelo configurado da classe
	 * 
	 * @return string
	 */
	public function NomeModelo($modelo = ''){
		if($modelo){
			$this->NomeModelo = $modelo;
		}else{
			return $this->NomeModelo;
		}
	}
	
	/**
	 * Retorna Instancia do Modelo
	 * 
	 * @return Modelo
	 */
	public function Modelo($modelo = ''){
		if(!empty($modelo)){
			$this->Modelo = $modelo;
		}else{
			return $this->Modelo;
		}
	}
	
	public function Titulo($title  = ''){
		if($title){
			$this->titulo = $title;
		}else{
			return $this->titulo;
		}
	}

	/**
	 * Controla se os dados serão persistentes em tela ou não.
	 * 
	 * @param $per boolean
	 * @return boolean
	 */
	public function Persistencia($per = false){
		if($per != ''){
			$this->persistencia = $per;
		}else{
			return $this->persistencia;
		}
	}

	/**
	 * Realiza operações manuais na exibição dos dados na tela.
	 */
	public function MostraTela(){
		
	}
	
	/**
	 * Inicializa parametros necessários de acordo com o Controlador que está sendo usado, método para ser implementado
	 * no controlador.
	 *
	 * @return Array parametros passados
	 */
	public function Init(){
		$this->Dao = Dao::Instanciar();
		$this->Dao->Conectar();
	}

	public function Conteudo($cont = ''){
		if($cont){ $this->Conteudo = $cont; }else{ return $this->Conteudo; }
	}

	public function GetTrocaConteudo(){
		return $this->TrocaConteudo;
	}

	function __construct(Sistema $Sys, Core $Core, Aplicacao $App, $dao = '') {
	   $this->Sistema 	= $Sys;
	   $this->Core 		= $Core;
	   $this->Aplicacao = $App;
	   $this->Dao 		= (!empty($dao)) ? $dao : '';
	}

	public function Salvar(){
	   $this->modelo = $this->GetDao()->salvar($this->Modelo());
	   Mensagens::NovaMensagem('Sucesso', 'Registro salvo com sucesso!');
	}

	public function Excluir(){
		$this->Modelo()->delete();
		echo "Registro removido com sucesso!";
		die();
	}

	public function Editar(){
		$this->Persistencia(true);
	}

	protected function MudaNomeArquivo(array $file, $prefixo){
            $name = Utils::TimestampAtual();
            $ext = end(@explode('.', $file['name'] ));
            $file['name'] = ("$prefixo{$name}.{$ext}");
            return $file;
    }

	/**
	 * Configuração prévia do modelo usado pelo controle e também das propriedades de formulário
	 * do controle.
	 * 
	 * @return void
	 */
    public function ConfiguraModelo(){
    	$parans = $this->GetSistema()->GetParametros();
   		$pre = 'set_';

    	if($this->NomeModelo() != ''){
			$tmp_nome_modelo = $this->NomeModelo();

    		if(isset($parans['id']) && $parans['id'] != '' ){
    			$modelo = $this->GetDao()->busca_por_id($tmp_nome_modelo, $parans['id'] );
    		}else{
    			$modelo = new $tmp_nome_modelo;
    		}
    		
    		$sets = get_class_methods($modelo);
    		foreach($parans as $paran => $val){ // Configurando propriedades do modelo caso exista
    			for($i = 1; $i < sizeof($sets); $i++){
    				$param_set = $pre . $paran;
    				if($param_set == $sets[$i]){
    					$metodo = $sets[$i];
    					$modelo->$metodo($val);
    				}
    			}
    		}
    		$this->Modelo($modelo);
    	}

    	$sets = get_class_methods($this);

    	foreach($parans as $paran => $val){ // Configurando propriedades do controle
    		$size_sets = sizeof($sets);
    		for($i = 1; $i < $size_sets; $i++){
    			$param_set = $pre . $paran;
    			if($param_set == $sets[$i]){
    				$metodo = $sets[$i];
    				$this->$metodo($val);
    			}
    			if($i == sizeof($sets)){
    				break;
    			}
    		}
    	}

    }

    public function AddTagConteudo(array $valores){
    	foreach($valores as $val => $content){
    		$this->TrocaConteudo[$val] = $content;
    	}
    }

    public function Finaliza(){
    	$this->AddTagConteudo(array('%titulo-pagina%'=> $this->titulo));
    }

	public function ExibeTamanhoArquivo($filesize){

	    if(is_numeric($filesize)){
		    $decr = 1024; $step = 0;
		    $prefix = array('Byte','KB','MB','GB','TB','PB');

		    while(($filesize / $decr) > 0.9){
		        $filesize = $filesize / $decr;
		        $step++;
		    }
		    return round($filesize,2).' '.$prefix[$step];
	    }else{
	    	return 'Não é um número válido';
	    }
	}

	public function DoctrineToXml(Doctrine_Collection $dr){

		$xml = "<registros>";
		foreach($dr as $materia){
			$ar_mat = $materia->toArray(true);
			$xml .= "<item>";
			foreach($ar_mat as $chave => $valor){
				$xml .= "<$chave>$valor</$chave>";
			}
			$xml .= "</item>";
		}
		$xml .= "</registros>";

		return $xml;
	}
}